6-2 Hqv閬﹠動畫

以電影方式來產生動畫,可由下列兩個步驟來達成:

  1. 使用 getframe 指令來抓取圖形做為電影的畫面,每個畫面都是以一個行向量的方式,置放於整個代表電影的矩陣。
  2. 使用 movie 指令來播放電影,並可指定播放的重複次數及每秒播放的畫面數目。

在下例中,我們將以不同的角度來顯示 peaks 函數,並將其結果以電影的方式來呈現動畫。

Example 1: 06-動畫製作/movie01.mclear M % 清除電影資料矩陣 M n = 50; % 抓取 50 個畫面 figure('Renderer','zbuffer'); % Only used in MS Windows peaks; fprintf('抓取畫面中...\n'); for i = 1:n view([-37.5+i*360/n, 30]); % 改變觀測角度 M(i) = getframe; % 抓取畫面,並存入電影資料矩陣 M end fprintf('播放電影中...\n'); movie(M, 3); % 播放電影三次 z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ... - 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ... - 1/3*exp(-(x+1).^2 - y.^2) 抓取畫面中... 播放電影中...

(上圖僅僅秀出最後一個 frame 的畫面。你必須親自執行此範例,才能看到動畫效果。)

在上述範例中,我們使用 getframe 指令來將圖形視窗的資料儲存到矩陣 M,最後使用 movie(M, 3) 來連續播放存放於矩陣 M 的電影資料三次。

以下這個範例,則是將 peaks 函數畫在圓盤上,然後再變換此函數的高度,以動畫呈現:

Example 2: 06-動畫製作/movie02.mclear M % 清除電影資料矩陣 M r=linspace(0, 4, 30); % 圓盤的半徑 t=linspace(0, 2*pi, 50); % 圓盤的極座標角度 [rr, tt]=meshgrid(r, t); xx=rr.*cos(tt); % 產生圓盤上的 x 座標 yy=rr.*sin(tt); % 產生圓盤上的 y 座標 zz=peaks(xx,yy); % 產生 peaks 在極座標的資料 n = 30; % 抓取 30 個畫面 scale = cos(linspace(0, 2*pi, n)); figure('Renderer','zbuffer'); % Only used in MS Windows fprintf('抓取畫面中...\n'); for i = 1:n surf(xx, yy, zz*scale(i)); % 畫圖 axis([-inf inf -inf inf -8.5 8.5]); % 固定圖軸的範圍 box on M(i) = getframe; % 抓取畫面,並存入電影資料矩陣 M end fprintf('播放電影中...\n'); movie(M, 5); % 播放電影 5 次抓取畫面中... 播放電影中...

(上圖僅僅秀出最後一個 frame 的畫面。你必須親自執行此範例,才能看到動畫效果。)

下面這個範例,則是改變影像的色盤矩陣,讓影像出現「從正片變到負片」的效果,然後再變回來:

Example 3: 06-動畫製作/movie03.mclear M % 清除電影資料矩陣 M load clown.mat image(X); colormap(map); % 畫出小丑臉 n = 30; % 抓取 30 個畫面 scale = cos(linspace(0, 2*pi, n)); fprintf('抓取畫面中...\n'); for i = 1:n colormap(((i-1)*(1-map)+(n-i)*map)/(n-1)); % 改變色盤矩陣 M(i) = getframe; % 抓取畫面,並存入電影資料矩陣 M end fprintf('播放電影中...\n'); movie(M, -5); % 播放電影 5 次抓取畫面中... 播放電影中...

(上圖僅僅秀出最後一個 frame 的畫面。你必須親自執行此範例,才能看到動畫效果。)

在上述範例中,正片(如下第一圖)的色盤矩陣是 map,而 1-map 則是負片(如下第二圖)的色盤矩陣,因此我們在抓影片時,讓色盤矩陣進行漸進式的變化,因此呈現的電影就有「從正片變到負片」的效果。另外,movie(M, -5) 代表電影將播放 5 次,但由於第二個參數是負數,所以每次播放會包含一次「正向播放」及一次「逆向播放」。


MATLAB程式設計:入門篇